package com.softer.wxzj.controller;

import com.github.pagehelper.PageInfo;
import com.softer.wxzj.common.aop.annotation.LogRecord;
import com.softer.wxzj.common.aop.enums.LogOperationType;
import com.softer.wxzj.common.aop.enums.LogOperationUnit;
import com.softer.wxzj.common.entity.CommonResult;
import com.softer.wxzj.common.entity.Page;
import com.softer.wxzj.entity.*;
import com.softer.wxzj.mapper.SysOperatorMapper;
import com.softer.wxzj.service.OrgBankInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 拨款账户管理
 *
 * @author Gong Zhiyang
 * @date 2019/7/12
 */
@RestController
@RequestMapping("/orgBank")
public class OrgBankInfoController {
    @Autowired
    private OrgBankInfoService orgBankInfoService;
    @Autowired
    private SysOperatorMapper sysOperatorMapper;

    /**
     * 物业银行账号新增
     *
     * @param orgBankInfo 银行账号
     * @return 结果
     */
    @PostMapping("/add")
    public CommonResult add(@RequestBody OrgBankInfo orgBankInfo) {
        return orgBankInfoService.add(orgBankInfo);
    }

    /**
     * 启用/停用账号 1启用，0停用
     *
     * @param id    账号ID
     * @param state 1启用，0停用
     * @return 修改结果
     */
    @PostMapping("/updateState")
    public CommonResult updateState(String id, String state) {
        return orgBankInfoService.updateState(id, state);
    }

    /**
     * 查询某个物业企业下的所有账号
     *
     * @param page        分页实体
     * @param orgBankInfo 查询实体 orgId 物业企业ID必传
     * @return 账号列表
     */
    @PostMapping("/getOrgBankInfoList")
    public PageInfo<OrgBankInfo> getOrgBankInfoList(Page page, OrgBankInfo orgBankInfo) {
        return orgBankInfoService.getOrgBankInfoList(page, orgBankInfo);
    }

    /**
     * 查询某个物业企业下的所有账号
     *
     * @param page        分页实体
     * @param orgBankInfo 查询实体 orgId 物业企业ID必传
     * @return 账号列表
     */
    @PostMapping("/getOrgBankInfoListFromExtraNet")
    public PageInfo<OrgBankInfo> getOrgBankInfoListFromExtraNet(Page page, OrgBankInfo orgBankInfo) {
        SysOperator sysOperator = sysOperatorMapper.selectName(orgBankInfo.getOperNo());
        if (sysOperator==null) {
            return new PageInfo<>(new ArrayList<>());
        }
        orgBankInfo.setOrgId(sysOperator.getCompanyId());
        return orgBankInfoService.getOrgBankInfoList(page, orgBankInfo);
    }


    /**
     * 查询详情
     *
     * @param id      账号ID
     * @param arcType 图档大类
     * @return 详情
     */
    @PostMapping("/getInfo")
    public OrgBankInfo getInfo(String id, String arcType) {
        return orgBankInfoService.getInfo(id, arcType);
    }

    /**
     * 修改物业企业账号
     *
     * @param orgBankInfo 账号实体
     * @return 修改结果
     */
    @PostMapping("/update")
    public CommonResult update(@RequestBody OrgBankInfo orgBankInfo) {
        return orgBankInfoService.update(orgBankInfo, orgBankInfo.getReason());
    }

    /**
     * 外网调用，修改物业企业账号
     *
     * @param orgBankInfo 账号实体
     * @return 修改结果
     */
    @PostMapping("/updateOrg")
    public CommonResult updateOrg(@RequestBody OrgBankInfo orgBankInfo) {
        return orgBankInfoService.updateOrg(orgBankInfo);
    }

    /**
     * 根据ID查询变更记录
     *
     * @param page          分页实体
     * @param baseModifyReq 查询实体 账号ID（也是变更表中的业务ID）
     * @return 变更记录列表
     */
    @PostMapping("/getReqListById")
    public PageInfo<BaseModifyReq> getReqListById(Page page, BaseModifyReq baseModifyReq) {
        return orgBankInfoService.getReqListById(page, baseModifyReq);
    }

    /**
     * 外网查询收款账号变更详情
     *
     * @param id 收款账号ID（也是变更表中的业务ID）
     * @return 收款账号变更详情列表
     */
    @RequestMapping("/getModifyDetailList")
    @LogRecord(description = "外网查询收款账号变更详情", operationUnit = LogOperationUnit.ORG_BANK, operationType = LogOperationType.SELECT)
    public PageInfo<BaseModifyDetail> getModifyDetailList(Page page, String id) {
        return orgBankInfoService.getModifyDetailList(page, id);
    }

    /**
     * 查询所有正常使用的账户列表
     *
     * @return 列表
     */
    @PostMapping("/getList")
    public List<OrgBankInfo> getList() {
        return orgBankInfoService.getList();
    }

    /**
     * 获取企业下可用账号列表
     *
     * @param id 企业ID
     * @return 银行账户列表
     */
    @PostMapping("/getOrgBankAccount")
    public List<OrgBankInfo> getOrgBankAccount(String id) {
        return orgBankInfoService.getOrgBankAccount(id);
    }

    /**
     * 新增物业企业和企业银行账户
     *
     * @param organization 物业企业信息
     * @param orgBankInfo  银行账户信息
     * @return 新增结果
     */
    @PostMapping("/addCorpAndOrgBank")
    public CommonResult addCorpAndOrgBank(BaseOrganization organization, OrgBankInfo orgBankInfo) {
        return orgBankInfoService.addCorpAndOrgBank(organization, orgBankInfo);
    }

    /**
     * 修改物业企业和企业银行账户
     *
     * @param organization 物业企业信息
     * @param orgBankInfo  银行账户信息
     * @return 修改结果
     */
    @PostMapping("/updateCorpAndOrgBank")
    public CommonResult updateCorpAndOrgBank(BaseOrganization organization, OrgBankInfo orgBankInfo) {
        return orgBankInfoService.updateCorpAndOrgBank(organization, orgBankInfo);
    }

    /**
     * 新增业委会和企业银行账户
     *
     * @param baseOwnerCommittee 业委会信息
     * @param orgBankInfo        银行账户信息
     * @return 新增结果
     */
    @PostMapping("/addCommitteeAndOrgBank")
    public CommonResult addCommitteeAndOrgBank(BaseOwnerCommittee baseOwnerCommittee, OrgBankInfo orgBankInfo) {
        return orgBankInfoService.addCommitteeAndOrgBank(baseOwnerCommittee, orgBankInfo);
    }

    /**
     * 修改业委会和企业银行账户
     *
     * @param baseOwnerCommittee 业委会信息
     * @param orgBankInfo        银行账户信息
     * @return 修改结果
     */
    @PostMapping("/updateCommitteeAndOrgBank")
    public CommonResult updateCommitteeAndOrgBank(BaseOwnerCommittee baseOwnerCommittee, OrgBankInfo orgBankInfo) {
        return orgBankInfoService.updateCommitteeAndOrgBank(baseOwnerCommittee, orgBankInfo);
    }

    /**
     * 根据项目ID查询该项目的收款单位
     *
     * @param id 拨款ID
     * @return 收款单位集合（申请单位和施工单位）
     */
    @PostMapping("/getOrgByReqId")
    public List<Map<String,String>> getOrgByReqId(String id) {
        return orgBankInfoService.getOrgByReqId(id);
    }
}
